#include "lua_help.h"
#include <stdio.h>
extern "C"
{
#include <lualib.h>
#include <lauxlib.h>
}
int read_table(const char *fname)
{
    lua_State *state = luaL_newstate();
    luaL_openlibs(state);
    int chinese, english;
    if (luaL_loadfile(state, fname) || lua_pcall(state, 0, 0, 0))
        return 1;

    lua_getglobal(state, "score");    // 全局变量 score 压栈
    lua_pushstring(state, "chinese"); // 字符串 chinese 压栈
    lua_gettable(state, -2);          // 以自顶向下第二个元素为表、第一个元素为索引取值，弹栈，将该值压栈
    if (!lua_isnumber(state, -1))     // 栈顶元素是否为数字
        return 2;
    
    chinese = lua_tointeger(state, -1);
    lua_pop(state, 1);                  // 弹出一个元素 (此时栈顶为 score 变量)

    // nlua_stack_dump(state);
    lua_getfield(state, -1, "english"); // Lua5.1开始提供该函数简化两行
    luaL_checknumber(state, -1);      //第二种检测方法 不需要判断返回值
    english = lua_tointeger(state, -1);
    printf("read table->  chinese: %d, english: %d\n", chinese, english);

    lua_settop(state, 0); // 如果就此结束，这一行弹不弹都无所谓了

    lua_close(state);
    return 0;
}

int read_var(const char *fname){

    lua_State *state = luaL_newstate();
    luaL_openlibs(state);
    int w, h;

    if (luaL_loadfile(state, fname) || // 读取文件，将内容作为一个函数压栈
        lua_pcall(state, 0, 0, 0))     // 执行栈顶函数，0个参数、0个返回值、无出错处理函数（出错时直接把错误信息压栈）
        return 1;
    lua_getglobal(state, "width");  // 将全局变量 width 压栈
    lua_getglobal(state, "height"); // 将全局变量 height 压栈
    if (!lua_isnumber(state, -2))   // 自顶向下第二个元素是否为数字
        return 2;
    if (!lua_isnumber(state, -1)) // 自顶向下第一个元素是否为数字
        return 3;
    w = lua_tointeger(state, -2); // 自顶向下第二个元素转为整型返回
    h = lua_tointeger(state, -1); // 自顶向下第一个元素转为整型返回
    printf("read var->  w: %d, h: %d\n", w, h);

    lua_pop(state, 1);
    lua_pop(state, 1);
    
    lua_close(state);
}

int read_func(const char *fname) {  
    lua_State *L;  
    if(NULL == (L = luaL_newstate())) {  
        perror("luaL_newstate failed");  
        return -1;  
    }  
    luaL_openlibs(L);  
    if(luaL_loadfile(L, "./demo.lua")) {  
        perror("loadfile failed");  
        return -1;  
    }  
    lua_pcall(L, 0, 0, 0);
    lua_getglobal(L, "printmsg");  
    lua_pcall(L, 0, 0, 0);  
    lua_close(L);        
    return 0;  
} 